package com.lenovo.spider.config;

import cn.hutool.core.collection.CollUtil;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;

import java.util.List;
import java.util.Optional;
import java.util.function.Function;

/**
 * @author <a href="mailto:liuhan3@lenovo.com">HanL(liuhan3)</a>
 * on 2018/3/27 14:09
 */
public class ConfigHolder {
    public static final Config CONF = ConfigFactory.load();

    /**
     * 获取String类型配置，默认为空字符串
     *
     * @param key
     * @return
     */
    public static String getString(String key) {
        return getString(key, "");
    }

    /**
     * 获取String类型配置，如果不存在返回defaultValue
     *
     * @param key
     * @param defaultValue
     * @return
     */
    public static String getString(String key, String defaultValue) {
        return checkAndRead(key, CONF::getString).orElse(defaultValue);
    }

    /**
     * 获取String列表类型配置，默认为空数组
     *
     * @param key
     * @return
     */
    public static List<String> getStrings(String key) {
        return checkAndRead(key, CONF::getStringList).orElse(CollUtil.newArrayList());
    }

    /**
     * 获取int类型的配置，默认为0
     *
     * @param key
     * @return
     */
    public static int getInt(String key) {
        return getInt(key, 0);
    }

    /**
     * 获取int类型的配置，如果不存在返回defaultValue
     *
     * @param key
     * @param defaultValue
     * @return
     */
    public static int getInt(String key, int defaultValue) {
        return checkAndRead(key, CONF::getInt).orElse(defaultValue);
    }

    /**
     * 获取long类型的配置，默认为0
     *
     * @param key
     * @return
     */
    public static long getLong(String key) {
        return getLong(key, 0L);
    }

    /**
     * 获取龙类型的配置，如果不存在返回defaultValue
     *
     * @param key
     * @param defaultValue
     * @return
     */
    public static long getLong(String key, long defaultValue) {
        return checkAndRead(key, CONF::getLong).orElse(defaultValue);
    }

    /**
     * 获取boolean类型的配置，默认为false
     *
     * @param key
     * @return
     */
    public static boolean getBoolean(String key) {
        return getBoolean(key, false);
    }

    /**
     * 获取boolean类型的配置，如果不存在返回defaultValue
     *
     * @param key
     * @param defaultValue
     * @return
     */
    public static boolean getBoolean(String key, boolean defaultValue) {
        return checkAndRead(key, CONF::getBoolean).orElse(defaultValue);
    }


    /**
     * 检查并读取key的值
     *
     * @param key
     * @param getFn
     * @param <T>
     * @return
     */
    public static <T> Optional<T> checkAndRead(String key, Function<String, T> getFn) {
        if (CONF.hasPathOrNull(key)) {
            return Optional.ofNullable(getFn.apply(key));
        } else {
            return Optional.empty();
        }
    }

    public static boolean has(String key) {
        return CONF.hasPathOrNull(key);
    }

}
